home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / oper_sys / emerald / emrldsys.lha / Language / Compiler / em.ccompiler.y < prev    next >
Text File  |  1990-08-16  |  24KB  |  931 lines

  1. %{
  2. /*
  3.  * @(#)em.ccompiler.act    1.1  3/17/89
  4.  */
  5. #include <stdio.h>
  6. #include "y.tab.h"
  7. #include "error.h"
  8. #include "tokens.h"
  9. #include "nodes.h"
  10. #include "keyword.h"
  11. #include "sequence.h"
  12. #include "semantics.h"
  13. #define YYSTYPE NodePtr
  14.  
  15. extern NodePtr Root, buildString();
  16. static int nextPhoney = 0;
  17. %} 
  18. %start compilation 
  19. %token  TIDENTIFIER /* "identifier" */
  20. %token  TOPERATOR /* "operator"  */
  21. %token  TLPAREN /* "(" */
  22. %token  TRPAREN /* ")" */
  23. %token  TLSQUARE /* "[" */
  24. %token  TRSQUARE /* "]" */
  25. %token  TLCURLY /*  "{" */
  26. %token  TRCURLY /*  "}" */
  27. %token  TDOLLAR /*  "$" */
  28. %token  TDOT /*  "." */
  29. %token  TCOMMA /*  "," */
  30. %token  TCOLON /*  ":" */
  31. %token  TSUGARASSIGN /*  ":=" */
  32. %token  TINTEGERLITERAL /*  "integer" */
  33. %token  TREALLITERAL /*  "real" */
  34. %token  TCHARACTERLITERAL /*  "character" */
  35. %token  TSTRINGLITERAL /*  "string" */
  36. %token  TEOF 0 /*  "end of file" */
  37. %token  OAND /*  "&" */
  38. %token  OASSIGN /*  "<-" */
  39. %token  OCONFORMSTO /*  "*>" */
  40. %token  ODIVIDE /*  "/" */
  41. %token  OEQUAL /*  "=" */
  42. %token  OGREATER /*  ">" */
  43. %token  OGREATEREQUAL /*  ">=" */
  44. %token  OIDENTITY /*  "==" */
  45. %token  OLESS /*  "<" */
  46. %token  OLESSEQUAL /*  "<=" */
  47. %token  OMINUS /*  "-" */
  48. %token  OMOD /*  "#" */
  49. %token  ONEGATE /*  "~" */
  50. %token  ONOT /*  "!" */
  51. %token  ONOTEQUAL /*  "!=" */
  52. %token  ONOTIDENTITY /*  "!==" */
  53. %token  OOR /*  "|" */
  54. %token  OPLUS /*  "+" */
  55. %token  ORETURNS /*  "->" */
  56. %token  OTIMES /*  "*" */
  57. %token  KABSTRACTTYPE /*  "abstracttype" */
  58. %token  KAND /*  "and" */
  59. %token  KALL /*  "all" */
  60. %token  KANY /*  "any" */
  61. %token  KARRAY /*  "array" */
  62. %token  KAS /*  "as" */
  63. %token  KASSERT /*  "assert" */
  64. %token  KAT /*  "at" */
  65. %token  KAWAITING /*  "awaiting" */
  66. %token  KATTACHED /*  "attached" */
  67. %token  KBEGIN /*  "begin" */
  68. %token  KBOOLEAN /*  "boolean" */
  69. %token  KBY /*  "by" */
  70. %token  KCHARACTER /*  "character" */
  71. %token  KCHECKPOINT /*  "checkpoint" */
  72. %token  KCONDITION /*  "condition" */
  73. %token  KCONFIRM /*  "confirm" */
  74. %token  KCONST /*  "const" */
  75. %token  KDIRECT /*  "direct" */
  76. %token  KDO /*  "do" */
  77. %token  KELSE /*  "else" */
  78. %token  KELSEIF /*  "elseif" */
  79. %token  KEND /*  "end" */
  80. %token  KENUMERATION /*  "enumeration" */
  81. %token  KEXIT /*  "exit" */
  82. %token  KEXPORT /*  "export" */
  83. %token  KFAILURE /*  "failure" */
  84. %token  KFALSE /*  "false" */
  85. %token  KFIX /*  "fix" */
  86. %token  KFOR /*  "for" */
  87. %token  KFROM /*  "from" */
  88. %token  KFUNCTION /*  "function" */
  89. %token  KNONE /*  "none" */
  90. %token  KOWNNAME /*  "ownname" */
  91. %token  KOWNTYPE /*  "owntype" */
  92. %token  KGLOBAL /*  "global" */
  93. %token  KIF /*  "if" */
  94. %token  KIMMUTABLE /*  "immutable" */
  95. %token  KIMPORT /*  "import" */
  96. %token  KINITIALLY /*  "initially" */
  97. %token  KINTEGER /*  "integer" */
  98. %token  KISFIXED /*  "isfixed" */
  99. %token  KLOCAL /*  "local" */
  100. %token  KLOCATE /*  "locate" */
  101. %token  KLOOP /*  "loop" */
  102. %token  KMONITOR /*  "monitor" */
  103. %token  KMOVE /*  "move" */
  104. %token  KNIL /*  "nil" */
  105. %token  KNODE /*  "node" */
  106. %token  KOBJECT /*  "object" */
  107. %token  KON /*  "on" */
  108. %token  KOP /*  "op" */
  109. %token  KOPERATION /*  "operation" */
  110. %token  KOR /*  "or" */
  111. %token  KPRIMITIVE /*  "primitive" */
  112. %token  KPRIVATE /*  "private" */
  113. %token  KRESTRICT /*  "restrict" */
  114. %token  KSIGNATURE /*  "signature" */
  115. %token  KPROCESS /*  "process" */
  116. %token  KREAL /*  "real" */
  117. %token  KRECORD /*  "record" */
  118. %token  KRECOVERY /*  "recovery" */
  119. %token  KREFIX /*  "refix" */
  120. %token  KRETURN /*  "return" */
  121. %token  KRETURNANDFAIL /*  "returnandfail" */
  122. %token  KSELF /*  "self" */
  123. %token  KSIGNAL /*  "signal" */
  124. %token  KSTRING /*  "string" */
  125. %token  KTHEN /*  "then" */
  126. %token  KTIME /*  "time" */
  127. %token  KTO /*  "to" */
  128. %token  KTRUE /*  "true" */
  129. %token  KTYPE /*  "type" */
  130. %token  KUNAVAILABLE /*  "unavailable" */
  131. %token  KUNFIX /*  "unfix" */
  132. %token  KUNION /*  "union" */
  133. %token  KVAR /*  "var" */
  134. %token  KVECTOR /*  "vector" */
  135. %token  KVIEW /*  "view" */
  136. %token  KVISIT /*  "visit" */
  137. %token  KWAIT /*  "wait" */
  138. %token  KWHEN /*  "when" */
  139. %token  KWHILE /*  "while" */
  140. %token  KWHERE /*  "where" */
  141. %right  KAS KVIEW KTO KRESTRICT /* precedence, lowest first */
  142. %left  OOR KOR 
  143. %left  OAND KAND 
  144. %left  ONOT 
  145. %left  OIDENTITY ONOTIDENTITY OEQUAL ONOTEQUAL OGREATER OLESS OGREATEREQUAL OLESSEQUAL OCONFORMSTO 
  146. %left  OPLUS OMINUS 
  147. %left  OTIMES ODIVIDE OMOD TOPERATOR 
  148. %left  ONEGATE KISFIXED KLOCATE KAWAITING 
  149. %%
  150. compilation :
  151.         environmentImportS environmentExportS constantDeclarationS 
  152.         { Root = Construct(P_COMP, 3, $1, $2, $3); }
  153.     ;
  154. constantDeclarationS :
  155.         constantDeclaration 
  156.         { $$ = RCONS(NULL, $1); }
  157.     |    constantDeclarationS constantDeclaration 
  158.         { $$ = RCONS($1, $2); }
  159.     ;
  160. empty :
  161.         
  162.         { $$ = NULL; }
  163.     ;
  164. environmentImportS :
  165.         empty 
  166.     |    environmentImportS environmentImport 
  167.         { $$ = RCONS($1, $2); }
  168.     ;
  169. environmentImport :
  170.         KIMPORT symbolDefinitionS KFROM environmentPathName 
  171.         { $$= Construct(P_IMPORT, 2, $2, $4); }
  172.     ;
  173. environmentExportS :
  174.         empty 
  175.     |    environmentExportS environmentExport 
  176.         { $$ = RCONS($1, $2); }
  177.     ;
  178. environmentExport :
  179.         KEXPORT symbolReferenceS KTO environmentPathName 
  180.         { $$ = Construct(P_EXPORT, 2, $2, $4); }
  181.     ;
  182. environmentPathName :
  183.         TSTRINGLITERAL 
  184.     ;
  185. typeClauseOpt :
  186.         empty 
  187.     |    typeClause 
  188.     ;
  189. typeClause :
  190.         TCOLON typeDefinition 
  191.         { $$ = $2; }
  192.     ;
  193. typeDefinition :
  194.         invocation 
  195.     ;
  196. builtinType :
  197.         
  198.         /* taken care of where it is called, so $$ = $1 is ok. */
  199.         KABSTRACTTYPE 
  200.     |    KANY 
  201.     |    KARRAY 
  202.     |    KBOOLEAN 
  203.     |    KCHARACTER 
  204.     |    KCONDITION 
  205.     |    KINTEGER 
  206.     |    KNODE 
  207.     |    KNONE 
  208.     |    KSIGNATURE 
  209.     |    KREAL 
  210.     |    KSTRING 
  211.     |    KTIME 
  212.     |    KVECTOR 
  213.     ;
  214. optVariable :
  215.         KVAR 
  216.     |    empty 
  217.     ;
  218. abstractType :
  219.         KTYPE optVariable symbolDefinition operationSignatureS KEND symbolReference 
  220.         { Names_Check($3, $6);
  221.           if (($6) != NULL) free($6);
  222.           $$ = Construct(P_ATLIT, 4, 
  223.              buildString(currentFileName), NULL, $3, $4);
  224.           ($$)->b.atlit.f.isTypeVariable = ($2 != NULL); }
  225.     ;
  226. record :
  227.         KRECORD symbolDefinition recordFieldS KEND symbolReference 
  228.         { Names_Check($2, $5);
  229.           if (($5) != NULL) free($5);
  230.           $$ = Construct(P_RECORDLIT, 2, $2, $3); }
  231.     ;
  232. recordFieldS :
  233.         recordField 
  234.         { $$ = RAPPEND(NULL, $1); }
  235.     |    recordFieldS recordField 
  236.         { $$ = RAPPEND($1, $2); }
  237.     ;
  238. recordField :
  239.         KVAR symbolDefinitionS typeClause 
  240.         { $$ = Distribute(P_VARDECL, $2, 2, $3, NULL); }
  241.     |    KATTACHED KVAR symbolDefinitionS typeClause 
  242.         { $$ = Distribute(P_VARDECL, $3, 2, $4, NULL);
  243.           {
  244.               register NodePtr q;
  245.               if (($$)->tag == T_SEQUENCE) {
  246.               Sequence_For(q, ($$))
  247.                   q->b.vardecl.isAttached = TRUE;
  248.               Sequence_Next
  249.               } else {
  250.               ($$)->b.vardecl.isAttached = TRUE;
  251.               }
  252.           }
  253.         }
  254.     ;
  255. union :
  256.         KUNION symbolDefinition recordFieldS KEND symbolReference 
  257.         { Names_Check($2, $5);
  258.           if (($5) != NULL) free($5);
  259.           $$ = Construct(P_UNIONLIT, 2, $2, $3); }
  260.     ;
  261. enumeration :
  262.         KENUMERATION symbolDefinitionS KEND 
  263.         { $$ = Construct(P_ENUMLIT, 1, $2); }
  264.     ;
  265. export :
  266.         empty 
  267.     |    KEXPORT operationNameReferenceS 
  268.         { $$ = Construct(P_EXPORT, 2, $2, NULL); }
  269.     ;
  270. operationNameReferenceS :
  271.         operationNameReference 
  272.         { $$ = RCONS(NULL, $1); }
  273.     |    operationNameReferenceS TCOMMA operationNameReference 
  274.         { $$ = RCONS($1, $3); }
  275.     ;
  276. symbolDefinitionS :
  277.         symbolDefinition 
  278.         { $$ = RCONS(NULL, $1); }
  279.     |    symbolDefinitionS TCOMMA symbolDefinition 
  280.         { $$ = RCONS($1, $3); }
  281.     ;
  282. symbolReferenceS :
  283.         symbolReference 
  284.         { $$ = RCONS(NULL, $1); }
  285.     |    symbolReferenceS TCOMMA symbolReference 
  286.         { $$ = RCONS($1, $3); }
  287.     ;
  288. operationSignatureS :
  289.         empty 
  290.     |    operationSignatureS operationSignature 
  291.         { $$ = RCONS($1, $2); }
  292.     ;
  293. operationSignature :
  294.         operationKind operationNameDefinition parameterClause returnClause whereClause 
  295.         { $$ = Construct(P_OPSIG, 4, $2, $3, $4, $5);
  296.          ($$)->b.opsig.isFunction = ((int)($1) == KFUNCTION); }
  297.     ;
  298. operationKind :
  299.         KOPERATION 
  300.     |    KOP 
  301.     |    KFUNCTION 
  302.     ;
  303. parameterClause :
  304.         empty 
  305.     |    TLSQUARE TRSQUARE 
  306.         { $$ = NULL; }
  307.     |    TLSQUARE parameterS TRSQUARE 
  308.         { $$ = $2; }
  309.     ;
  310. parameterS :
  311.         parameter 
  312.         { $$ = RCONS(NULL, $1); }
  313.     |    parameterS TCOMMA parameter 
  314.         { $$ = RCONS($1, $3); }
  315.     ;
  316. parameterFirstExpression :
  317.         expression 
  318.         {
  319.           $$ = Construct(P_PARAM, 3, $1, NULL, NULL);
  320.         }
  321.     |    KATTACHED expression 
  322.         {
  323.           $$ = Construct(P_PARAM, 3, $2, NULL, NULL);
  324.           ($$)->b.param.isAttached = TRUE;
  325.         }
  326.     |    KMOVE expression 
  327.         {
  328.           $$ = Construct(P_PARAM, 3, $2, NULL, NULL);
  329.           ($$)->b.param.move = TRUE;
  330.         }
  331.     |    KATTACHED KMOVE expression 
  332.         {
  333.           $$ = Construct(P_PARAM, 3, $3, NULL, NULL);
  334.           ($$)->b.param.isAttached = ($$)->b.param.move = TRUE;
  335.         }
  336.     |    KMOVE KATTACHED expression 
  337.         {
  338.           $$ = Construct(P_PARAM, 3, $3, NULL, NULL);
  339.           ($$)->b.param.isAttached = ($$)->b.param.move = TRUE;
  340.         }
  341.     ;
  342. parameter :
  343.         parameterFirstExpression 
  344.         { 
  345.           ($1)->b.param.type = ($1)->b.param.sym;
  346.           ($1)->b.param.sym = buildSymbol(P_SYMDEF, "@", nextPhoney++);
  347.           $$ = $1;
  348.         }
  349.     |    parameterFirstExpression TCOLON expression 
  350.         { 
  351.           if (($1)->b.param.sym->tag == P_SYMREF) ($1)->b.param.sym->tag = P_SYMDEF;
  352.           else {
  353.             BeginSyntaxErrorMessage();
  354.             ErrorWrite("Expected identifier, found expression");
  355.             EndErrorMessage();
  356.             ($1)->b.param.sym =  buildSymbol(P_SYMDEF, "@", nextPhoney++);
  357.           }
  358.           ($1)->b.param.type = $3;
  359.           $$ = $1;
  360.         }
  361.     ;
  362. returnClause :
  363.         empty 
  364.     |    ORETURNS TLSQUARE TRSQUARE 
  365.         { $$ = NULL; }
  366.     |    ORETURNS TLSQUARE parameterS TRSQUARE 
  367.         { $$ = $3; }
  368.     ;
  369. whereClause :
  370.         empty 
  371.     |    KWHERE whereWidgitS KEND KWHERE 
  372.         { $$ = $2; }
  373.     ;
  374. whereWidgitS :
  375.         whereWidgit 
  376.         { $$ = RCONS(NULL, $1); }
  377.     |    whereWidgitS whereWidgit 
  378.         { $$ = RCONS($1, $2); }
  379.     ;
  380. whereWidgit :
  381.         symbolDefinition whereOperator expression 
  382.         { $$ = Construct(P_WHEREWIDGIT, 3, $1, $2, $3);
  383.           if (($$)->b.wherewidgit.op == OASSIGN) ($$)->b.wherewidgit.op = OIDENTITY;
  384.           if ((int)$2==OCONFORMSTO) ($1)->tag = P_SYMREF; }
  385.     ;
  386. whereOperator :
  387.         OIDENTITY 
  388.     |    OASSIGN 
  389.     |    OCONFORMSTO 
  390.     ;
  391. object :
  392.         KOBJECT symbolDefinition export declarationS monitoredPart operationDefinitionS processDefinition KEND symbolReference 
  393.         { Names_Check($2, $9);
  394.          if (($9) != NULL) free($9);
  395.          $$ = Construct(P_OBLIT, 10, 
  396.             buildString(currentFileName), NULL, $2, NULL, NULL, 
  397.             $3, $4 ,$5, $6, $7); }
  398.     ;
  399. declarationS :
  400.         empty 
  401.     |    declarationS declaration 
  402.         { $$ = RAPPEND($1, $2); }
  403.     ;
  404. declaration :
  405.         
  406.         /* $$ = $1 */
  407.         constantDeclaration 
  408.     |    variableDeclaration 
  409.     |    error 
  410.     ;
  411. constantDefOp :
  412.         OIDENTITY 
  413.     |    OASSIGN 
  414.     ;
  415. constantDeclaration :
  416.         KCONST symbolDefinition typeClauseOpt constantDefOp expression 
  417.         { $$ = Construct(P_CONSTDECL, 3, $2, $3, $5); }
  418.     |    KATTACHED KCONST symbolDefinition typeClauseOpt constantDefOp expression 
  419.         { $$ = Construct(P_CONSTDECL, 3, $3, $4, $6);
  420.           ($$)->b.constdecl.isAttached = TRUE; }
  421.     ;
  422. initializerOpt :
  423.         empty 
  424.     |    OASSIGN expression 
  425.         { $$ = $2; }
  426.     ;
  427. initializer :
  428.         OASSIGN expression 
  429.         { $$ = $2; }
  430.     ;
  431. variableDeclaration :
  432.         KVAR symbolDefinitionS typeClause initializerOpt 
  433.         { $$ = Distribute(P_VARDECL, $2, 2, $3, $4); }
  434.     |    KATTACHED KVAR symbolDefinitionS typeClause initializerOpt 
  435.         { $$ = Distribute(P_VARDECL, $3, 2, $4, $5);
  436.           {
  437.           register NodePtr q;
  438.           if (($$)->tag == T_SEQUENCE) {
  439.               Sequence_For(q, ($$))
  440.               q->b.vardecl.isAttached = TRUE;
  441.               Sequence_Next
  442.           } else {
  443.               ($$)->b.vardecl.isAttached = TRUE;
  444.           }
  445.           }
  446.         }
  447.     ;
  448. monitoredPart :
  449.         empty 
  450.     |    KMONITOR declarationS operationDefinitionS initiallyDefinition recoveryDefinition KEND KMONITOR 
  451.         { $$ = Construct(P_MONITOR, 4, $2, $3, $4, $5); }
  452.     |    KINITIALLY blockBody KEND KINITIALLY 
  453.         {
  454.           $$ = Construct(P_INITDEF, 1, $2);
  455.           $$ = Construct(P_MONITOR, 4, NULL, NULL, $$, NULL);
  456.           ($$)->b.monitor.mayBeElided = TRUE;
  457.         }
  458.     ;
  459. operationDefinitionS :
  460.         empty 
  461.     |    operationDefinitionS operationDefinition 
  462.         { $$ = RCONS($1, $2); }
  463.     ;
  464. private :
  465.         KPRIVATE 
  466.     |    empty 
  467.     ;
  468. operationDefinition :
  469.         private operationSignature blockBody KEND operationNameReference 
  470.         { Names_Check(($2)->b.opsig.name, $5);
  471.          if (($5) != NULL) free($5);
  472.          $$ = Construct(P_OPDEF, 2, $2, $3);
  473.          if ($1 != NULL) ($$)->b.opdef.isPrivate = TRUE; }
  474.     ;
  475. blockBody :
  476.         declarationsAndStatements unavailableHandler failureHandler 
  477.         { $$ = Construct(P_BLOCK, 3, $1, $2, $3); }
  478.     ;
  479. initiallyDefinition :
  480.         empty 
  481.     |    KINITIALLY blockBody KEND KINITIALLY 
  482.         { $$ = Construct(P_INITDEF, 1, $2); }
  483.     ;
  484. recoveryDefinition :
  485.         empty 
  486.     |    KRECOVERY blockBody KEND KRECOVERY 
  487.         { $$ = Construct(P_RECOVERYDEF, 1, $2); }
  488.     ;
  489. processDefinition :
  490.         empty 
  491.     |    KPROCESS blockBody KEND KPROCESS 
  492.         { $$ = Construct(P_PROCESSDEF, 1, $2); }
  493.     ;
  494. declarationsAndStatements :
  495.         declarationS statementS 
  496.         { $$ = RAPPEND($1, $2); }
  497.     ;
  498. statementS :
  499.         empty 
  500.     |    statementS statement 
  501.         { $$ = RCONS($1, $2); }
  502.     ;
  503. statement :
  504.         ifStatement 
  505.     |    loopStatement 
  506.     |    forStatement 
  507.     |    exitStatement 
  508.     |    assignmentOrInvocationStatement 
  509.     |    assertStatement 
  510.     |    fixStatement 
  511.     |    refixStatement 
  512.     |    unfixStatement 
  513.     |    moveStatement 
  514.     |    compoundStatement 
  515.     |    primitiveStatement 
  516.     |    waitStatement 
  517.     |    signalStatement 
  518.     |    checkpointStatement 
  519.     |    returnStatement 
  520.     |    returnAndFailStatement 
  521.     |    error 
  522.     ;
  523. optDeclaration :
  524.         empty 
  525.     |    symbolDefinition typeClause 
  526.         { $$ = Construct(P_VARDECL, 3, $1, $2, NULL); }
  527.     ;
  528. unavailableHandler :
  529.         empty 
  530.     |    KWHEN optDeclaration KUNAVAILABLE blockBody KEND KUNAVAILABLE 
  531.         { $$ = Construct(P_UNAVAILABLEHANDLER, 2, $2, $4); }
  532.     ;
  533. failureHandler :
  534.         empty 
  535.     |    KON KFAILURE blockBody KEND KFAILURE 
  536.         { $$ = Construct(P_FAILUREHANDLER, 1, $3); }
  537.     ;
  538. ifClauseS :
  539.         ifClause 
  540.         { $$ = RCONS(NULL, $1); }
  541.     |    ifClauseS KELSEIF ifClause 
  542.         { $$ = RCONS($1, $3); }
  543.     ;
  544. ifClause :
  545.         expression KTHEN declarationsAndStatements 
  546.         { $$ = Construct(P_IFCLAUSE, 2, $1, $3); }
  547.     ;
  548. elseClause :
  549.         empty 
  550.     |    KELSE declarationsAndStatements 
  551.         { $$ = Construct(P_ELSECLAUSE, 1, $2); }
  552.     ;
  553. ifStatement :
  554.         KIF ifClauseS elseClause KEND KIF 
  555.         { $$ = Construct(P_IFSTAT, 2, $2, $3); }
  556.     ;
  557. forStatement :
  558.         KFOR TLPAREN assignmentOrInvocationStatement TCOLON expression TCOLON assignmentOrInvocationStatement TRPAREN statementS KEND KFOR 
  559.         { $$ = Construct(P_INVOC, 3, $5, makeOpName(ONOT), NULL);
  560.           $$ = Construct(P_EXITSTAT, 1, $$);
  561.           $$ = RCONS(NULL, $$);
  562.           $$ = RAPPEND($$, $9);
  563.           $$ = RCONS($$, $7);
  564.           $$ = Construct(P_LOOPSTAT, 1, $$);
  565.           $$ = RCONS(RCONS(NULL, $3), $$);
  566.           $$ = Construct(P_BLOCK, 3, $$, NULL, NULL);
  567.         }
  568.     |    KFOR symbolDefinition typeClause initializer KWHILE expression KBY assignmentOrInvocationStatement statementS KEND KFOR 
  569.         { $$ = Construct(P_INVOC, 3, $6, makeOpName(ONOT), NULL);
  570.           $$ = Construct(P_EXITSTAT, 1, $$);
  571.           $$ = RCONS(NULL, $$);
  572.           $$ = RAPPEND($$, $9);
  573.           $$ = RCONS($$, $8);
  574.           $$ = Construct(P_LOOPSTAT, 1, $$);
  575.           $$ = RCONS(RCONS(NULL, Construct(P_VARDECL, 3, $2, $3, $4)), $$);
  576.           $$ = Construct(P_BLOCK, 3, $$, NULL, NULL);
  577.         }
  578.     ;
  579. loopStatement :
  580.         KLOOP declarationsAndStatements KEND KLOOP 
  581.         { $$ = Construct(P_LOOPSTAT, 1, $2); }
  582.     ;
  583. exitStatement :
  584.         KEXIT whenClause 
  585.         { $$ = Construct(P_EXITSTAT, 1, $2); }
  586.     ;
  587. whenClause :
  588.         empty 
  589.     |    KWHEN expression 
  590.         { $$ = $2; }
  591.     ;
  592. assignmentOrInvocationStatement :
  593.         expressionS 
  594.         { if (($1)->nChildren > 1) {
  595.             BeginSyntaxErrorMessage();
  596.             ErrorWrite("Found expressionS where expression expected");
  597.             EndErrorMessage();
  598.             ($1)->nChildren = 1;
  599.           }
  600.           $$ = Construct(P_ASSIGNSTAT, 3, NULL, OASSIGN, $1);
  601.         }
  602.     |    expressionS assignmentOp expressionS 
  603.         { $$ = Construct(P_ASSIGNSTAT, 3, $1, $2, $3); }
  604.     ;
  605. assignmentOp :
  606.         OASSIGN 
  607.     |    TSUGARASSIGN 
  608.     ;
  609. assertStatement :
  610.         KASSERT expression 
  611.         { $$ = Construct(P_ASSERTSTAT, 1, $2); }
  612.     ;
  613. fixStatement :
  614.         KFIX expression KAT expression 
  615.         { $$ = Construct(P_FIXSTAT, 2, $2, $4); }
  616.     ;
  617. refixStatement :
  618.         KREFIX expression KAT expression 
  619.         { $$ = Construct(P_REFIXSTAT, 2, $2, $4); }
  620.     ;
  621. unfixStatement :
  622.         KUNFIX expression 
  623.         { $$ = Construct(P_UNFIXSTAT, 1, $2); }
  624.     ;
  625. moveStatement :
  626.         KMOVE expression KTO expression 
  627.         { $$ = Construct(P_MOVESTAT, 2, $2, $4); }
  628.     ;
  629. compoundStatement :
  630.         KBEGIN blockBody KEND 
  631.         { $$ = $2; }
  632.     ;
  633. checkpoint :
  634.         KCONFIRM 
  635.     |    KCONFIRM KCHECKPOINT 
  636.         { $$ = $1; }
  637.     |    KCHECKPOINT 
  638.     ;
  639. checkpointStatement :
  640.         checkpoint 
  641.         { $$ = Construct(P_CHECKPOINTSTAT, 2, (NodePtr)T_NONE, NULL);
  642.           ($$)->b.checkpointstat.confirm = ( ($1) == (NodePtr)KCONFIRM); }
  643.     |    checkpoint KTO expression 
  644.         { $$ = Construct(P_CHECKPOINTSTAT, 2, $2, $3);
  645.           ($$)->b.checkpointstat.confirm = ( ($1) == (NodePtr)KCONFIRM); }
  646.     |    checkpoint KAT expression 
  647.         { $$ = Construct(P_CHECKPOINTSTAT, 2, $2, $3);
  648.           ($$)->b.checkpointstat.confirm = ( ($1) == (NodePtr)KCONFIRM); }
  649.     |    checkpoint KAT KALL 
  650.         { $$ = Construct(P_CHECKPOINTSTAT, 2, $2, $3);
  651.           ($$)->b.checkpointstat.confirm = ( ($1) == (NodePtr)KCONFIRM); }
  652.     ;
  653. returnStatement :
  654.         KRETURN 
  655.         { $$ = Construct(P_RETURNSTAT, 0); }
  656.     ;
  657. returnAndFailStatement :
  658.         KRETURNANDFAIL 
  659.         { $$ = Construct(P_RETURNANDFAILSTAT, 0); }
  660.     ;
  661. primitiveImplementation :
  662.         TINTEGERLITERAL 
  663.         { $$ = Construct(P_INTLIT, 0);
  664.          ($$)->b.intlit.string = ($1)->b.string.string; }
  665.     |    TSTRINGLITERAL 
  666.         { $$ = Construct(P_STRINGLIT, 0);
  667.          ($$)->b.intlit.string = ($1)->b.string.string; }
  668.     ;
  669. primitiveStatement :
  670.         KPRIMITIVE primitiveImplementation TLSQUARE symbolReferenceSopt TRSQUARE OASSIGN TLSQUARE symbolReferenceSopt TRSQUARE 
  671.         { $$ = Construct(P_PRIMSTAT, 3, $2, $4, $8); }
  672.     ;
  673. symbolReferenceSopt :
  674.         empty 
  675.     |    symbolReferenceS 
  676.     ;
  677. waitStatement :
  678.         KWAIT expression 
  679.         { $$ = Construct(P_WAITSTAT, 1, $2); }
  680.     ;
  681. signalStatement :
  682.         KSIGNAL expression 
  683.         { $$ = Construct(P_SIGNALSTAT, 1, $2); }
  684.     ;
  685. expressionS :
  686.         expression 
  687.         { $$ = RCONS(NULL, $1); }
  688.     |    expressionS TCOMMA expression 
  689.         { $$ = RCONS($1, $3); }
  690.     ;
  691. expression :
  692.         expressionZero 
  693.     |    expression OOR expression 
  694.         { $$ = Construct(P_INVOC, 3, $1, makeOpName($2), singleArg($3)); }
  695.     |    expression KOR expression 
  696.         { $$ = Construct(P_EXP, 3, $1, $2, $3); }
  697.     |    expression OAND expression 
  698.         { $$ = Construct(P_INVOC, 3, $1, makeOpName($2), singleArg($3)); }
  699.     |    expression KAND expression 
  700.         { $$ = Construct(P_EXP, 3, $1, $2, $3); }
  701.     |    ONOT expression 
  702.         { $$ = Construct(P_INVOC, 3, $2, makeOpName($1), NULL); }
  703.     |    expression OIDENTITY expression 
  704.         { $$ = Construct(P_EXP, 3, $1, $2, $3); }
  705.     |    expression ONOTIDENTITY expression 
  706.         { $$ = Construct(P_EXP, 3, $1, $2, $3); }
  707.     |    expression OEQUAL expression 
  708.         { $$ = Construct(P_INVOC, 3, $1, makeOpName($2), singleArg($3)); }
  709.     |    expression ONOTEQUAL expression 
  710.         { $$ = Construct(P_INVOC, 3, $1, makeOpName($2), singleArg($3)); }
  711.     |    expression OGREATER expression 
  712.         { $$ = Construct(P_INVOC, 3, $1, makeOpName($2), singleArg($3)); }
  713.     |    expression OLESS expression 
  714.         { $$ = Construct(P_INVOC, 3, $1, makeOpName($2), singleArg($3)); }
  715.     |    expression OGREATEREQUAL expression 
  716.         { $$ = Construct(P_INVOC, 3, $1, makeOpName($2), singleArg($3)); }
  717.     |    expression OLESSEQUAL expression 
  718.         { $$ = Construct(P_INVOC, 3, $1, makeOpName($2), singleArg($3)); }
  719.     |    expression OCONFORMSTO expression 
  720.         { $$ = Construct(P_EXP, 3, $1, $2, $3); }
  721.     |    KVIEW expression KAS expression 
  722.         { $$ = Construct(P_VIEW, 2, $2, $4); }
  723.     |    KRESTRICT expression KTO expression 
  724.         { $$ = Construct(P_RESTRICT, 2, $2, $4); }
  725.     |    expression OPLUS expression 
  726.         { $$ = Construct(P_INVOC, 3, $1, makeOpName($2), singleArg($3)); }
  727.     |    expression OMINUS expression 
  728.         { $$ = Construct(P_INVOC, 3, $1, makeOpName($2), singleArg($3)); }
  729.     |    expression OTIMES expression 
  730.         { $$ = Construct(P_INVOC, 3, $1, makeOpName($2), singleArg($3)); }
  731.     |    expression ODIVIDE expression 
  732.         { $$ = Construct(P_INVOC, 3, $1, makeOpName($2), singleArg($3)); }
  733.     |    expression OMOD expression 
  734.         { $$ = Construct(P_INVOC, 3, $1, makeOpName($2), singleArg($3)); }
  735.     |    expression TOPERATOR expression 
  736.         { $$ = Construct(P_INVOC, 3, $1, makeOpName($2), singleArg($3)); }
  737.     |    ONEGATE expression 
  738.         { if (($2)->tag == P_INTLIT) {
  739.         char *old, *new;
  740.         old = ($2)->b.stringlit.string;
  741.         new = (char *)malloc(strlen(old) + 2);
  742.         if (*old == '-') {
  743.           strcpy(new, old+1);
  744.         } else {
  745.           strcpy(new, "-");
  746.           strcat(new, old);
  747.         }
  748.         ($2)->b.stringlit.string = new;
  749.         free(old);
  750.         $$ = $2;
  751.           } else {
  752.         $$ = Construct(P_INVOC, 3, $2, makeOpName($1), NULL);
  753.           }
  754.         }
  755.     |    KISFIXED expression 
  756.         { $$ = Construct(P_UNARYEXP, 2, $1, $2); }
  757.     |    KLOCATE expression 
  758.         { $$ = Construct(P_UNARYEXP, 2, $1, $2); }
  759.     |    KAWAITING expression 
  760.         { $$ = Construct(P_UNARYEXP, 2, $1, $2); }
  761.     ;
  762. expressionZero :
  763.         invocation 
  764.     |    expressionZero TDOLLAR TIDENTIFIER 
  765.         { $$ = Construct(P_FIELDSEL, 2, $1, $3); }
  766.     |    expressionZero TLPAREN argumentS TRPAREN 
  767.         { $$ = Construct(P_SUBSCRIPT, 2, $1, $3); }
  768.     ;
  769. invocation :
  770.         primary 
  771.     |    identifierOperationNameReference TLSQUARE TRSQUARE 
  772.         { $$ = Construct(P_INVOC, 3, Construct(P_SELFLIT, 0), $1, NULL); }
  773.     |    identifierOperationNameReference TLSQUARE argumentS TRSQUARE 
  774.         { $$ = Construct(P_INVOC, 3, Construct(P_SELFLIT, 0), $1, $3); }
  775.     |    expressionZero TDOT operationNameReference argumentClause 
  776.         { $$ = Construct(P_INVOC, 3, $1, $3, $4); }
  777.     ;
  778. primary :
  779.         literal 
  780.     |    symbolReference 
  781.     |    TLPAREN expression TRPAREN 
  782.         { $$ = $2; }
  783.     ;
  784. operationNameDefinition :
  785.         operationName 
  786.     |    operatorName 
  787.     |    definableOperatorName 
  788.         { $$ = makeOpName($1); }
  789.     ;
  790. operatorName :
  791.         TOPERATOR 
  792.         { $$ = makeOpName($1); }
  793.     ;
  794. operationName :
  795.         TIDENTIFIER 
  796.         { $$ = makeOpName($1); }
  797.     ;
  798. definableOperatorName :
  799.         OOR 
  800.     |    OAND 
  801.     |    OEQUAL 
  802.     |    ONOTEQUAL 
  803.     |    OGREATER 
  804.     |    OLESS 
  805.     |    OGREATEREQUAL 
  806.     |    OLESSEQUAL 
  807.     |    ONEGATE 
  808.     |    ONOT 
  809.     |    OPLUS 
  810.     |    OMINUS 
  811.     |    OTIMES 
  812.     |    ODIVIDE 
  813.     |    OMOD 
  814.     ;
  815. nondefinableOperatorName :
  816.         OIDENTITY 
  817.     |    ONOTIDENTITY 
  818.     |    OCONFORMSTO 
  819.     ;
  820. operationNameReference :
  821.         operatorName 
  822.     |    definableOperatorName 
  823.         { $$ = makeOpName($1); }
  824.     |    nondefinableOperatorName 
  825.         { $$ = makeOpName($1); }
  826.     |    operationName 
  827.     |    nondefinableOperationName 
  828.         { $$ = makeOpName($1); }
  829.     ;
  830. identifierOperationNameReference :
  831.         operationName 
  832.     |    nondefinableOperationName 
  833.         { $$ = makeOpName($1); }
  834.     ;
  835. nondefinableOperationName :
  836.         KOWNTYPE 
  837.     |    KOWNNAME 
  838.     ;
  839. argumentClause :
  840.         empty 
  841.     |    TLSQUARE TRSQUARE 
  842.         { $$ = NULL; }
  843.     |    TLSQUARE argumentS TRSQUARE 
  844.         { $$ = $2; }
  845.     ;
  846. argumentS :
  847.         argument 
  848.         { $$ = RCONS(NULL, $1); }
  849.     |    argumentS TCOMMA argument 
  850.         { $$ = RCONS($1, $3); }
  851.     ;
  852. argument :
  853.         expression 
  854.         { $$ = Construct(P_ARG, 1, $1); }
  855.     |    KMOVE expression 
  856.         { $$ = Construct(P_ARG, 1, $2);
  857.           ($$)->b.arg.move = 1; }
  858.     |    KVISIT expression 
  859.         { $$ = Construct(P_ARG, 1, $2);
  860.           ($$)->b.arg.visit = 1; }
  861.     ;
  862. literal :
  863.         TSTRINGLITERAL 
  864.         { $$ = Construct(P_STRINGLIT, 0);
  865.          ($$)->b.stringlit.string = ($1)->b.string.string;
  866.          free((char *) ($1)); }
  867.     |    TCHARACTERLITERAL 
  868.         { $$ = Construct(P_CHARLIT, 0);
  869.          ($$)->b.stringlit.string = ($1)->b.string.string;
  870.          free((char *) ($1)); }
  871.     |    TINTEGERLITERAL 
  872.         { $$ = Construct(P_INTLIT, 0);
  873.          ($$)->b.stringlit.string = ($1)->b.string.string;
  874.          free((char *) ($1)); }
  875.     |    TREALLITERAL 
  876.         { $$ = Construct(P_REALLIT, 0);
  877.          ($$)->b.stringlit.string = ($1)->b.string.string;
  878.          free((char *) ($1)); }
  879.     |    KTRUE 
  880.         { $$ = Construct(P_BOOLLIT, 0);
  881.          ($$)->b.boollit.value = 1; }
  882.     |    KFALSE 
  883.         { $$ = Construct(P_BOOLLIT, 0);
  884.          ($$)->b.boollit.value = 0; }
  885.     |    KSELF 
  886.         { $$ = Construct(P_SELFLIT, 0); }
  887.     |    KNIL 
  888.         { $$ = Construct(P_NILLIT, 0); }
  889.     |    builtinType 
  890.         { $$ = Construct(P_BUILTINLIT, 0);
  891.          ($$)->b.builtinlit.whichType = (int) $1; }
  892.     |    typeLiteral 
  893.     |    vectorLiteral 
  894.     ;
  895. vectorLiteral :
  896.         TLCURLY expressionSOpt typeClauseOpt TRCURLY 
  897.         { $$ = Construct(P_VECTORLIT, 3, $3, $2, NULL); }
  898.     ;
  899. expressionSOpt :
  900.         empty 
  901.     |    expressionS 
  902.     ;
  903. typeLiteral :
  904.         typeRest 
  905.         { ($1)->b.oblit.f.immutable = 0; $$ = $1; }
  906.     |    KIMMUTABLE typeRest 
  907.         { ($2)->b.oblit.f.immutable = 1; $$ = $2; }
  908.     ;
  909. typeRest :
  910.         
  911.         /* { $$ = $1 } for all cases */
  912.         abstractType 
  913.     |    object 
  914.     |    record 
  915.     |    union 
  916.     |    enumeration 
  917.     ;
  918. symbolReference :
  919.         TIDENTIFIER 
  920.         { $$ = Construct (P_SYMREF, 0);
  921.          ($$)->b.symref.ident = ($1)->b.ident.ident;
  922.          free ($1); }
  923.     ;
  924. symbolDefinition :
  925.         TIDENTIFIER 
  926.         { $$ = Construct (P_SYMDEF, 0);
  927.          ($$)->b.symdef.ident = ($1)->b.ident.ident;
  928.          free($1); }
  929.     ;
  930. %%
  931.